package com.example.nccdeploytool.util;

import com.example.nccdeploytool.entity.FileEntity;
import javafx.scene.control.TreeItem;
import org.controlsfx.glyphfont.Glyph;
import org.controlsfx.glyphfont.GlyphFont;
import org.controlsfx.glyphfont.GlyphFontRegistry;

import java.io.File;
import java.io.IOException;
import java.nio.file.*;
import java.util.ArrayList;
import java.util.List;
import java.util.function.BiConsumer;
import java.util.stream.Collectors;
import java.util.stream.Stream;

public class FileUtil {
    /**
     * 获取目录下所有文件（包括子目录）
     *
     * @param dirPath 目录路径
     * @return 文件路径列表
     */
    public static List<String> getAllFiles(String dirPath) throws IOException {
        try (Stream<Path> paths = Files.walk(Paths.get(dirPath))) {
            return paths
                    .filter(Files::isRegularFile)
                    .map(Path::toString)
                    .collect(Collectors.toList());
        }
    }
    /**
     * 获取目录下所有文件（包括子目录）
     *
     * @param dirPath 目录路径
     * @return 文件路径列表
     */
    public static List<String> getAllFileAndDir(String dirPath) throws IOException {
        try (Stream<Path> paths = Files.walk(Paths.get(dirPath))) {
            return paths
                    .map(Path::toString)
                    .collect(Collectors.toList());
        }
    }


    /**
     * 生成树状列表
     *
     * @param rootPath
     * @return
     */
    public static FileEntity generateFileTree(String rootPath) {
        File root = new File(rootPath);

        FileEntity fileEntity = new FileEntity();
        fileEntity.setFileName(root.getName());
        fileEntity.setFilePath(rootPath);
        fileEntity.setFileType("dir");

        dfsGenerateTree(fileEntity, 0);
        return fileEntity;
    }


    /**
     * 变量文件列表, 生产文件树
     * @param root
     * @param depth
     */
    public static void dfsGenerateTree(FileEntity root, int depth) {
        File fileRoot = new File(root.getFilePath());

        File[] files = fileRoot.listFiles();
        if (files == null) return;

        // region 按目录优先排序
        List<File> dirs = new ArrayList<>();
        List<File> normalFiles = new ArrayList<>();
        for (File f : files) {
            if (f.isDirectory()) dirs.add(f);
            else normalFiles.add(f);
        }
        List<File> sortedFiles = new ArrayList<>();
        sortedFiles.addAll(dirs);
        sortedFiles.addAll(normalFiles);
        // endregion

        for (int i = 0; i < sortedFiles.size(); i++) {
            File file = sortedFiles.get(i);

            FileEntity fileEntity = new FileEntity();
            fileEntity.setFileName(file.getName());
            fileEntity.setFilePath(file.getPath());
            fileEntity.setFileSize(file.length());
            fileEntity.setFileDepth(depth);

            fileEntity.setFileType(file.isDirectory() ? "dir" : "file");

            if (file.isDirectory()) {
                dfsGenerateTree(fileEntity, depth + 1);
            }
            root.getChildren().add(fileEntity);
        }
    }


    /**
     * 遍历文件树, 不包括根节点
     * @param root
     * @param func
     */
    public static void dfsFileEntity(FileEntity root, BiConsumer<FileEntity, FileEntity> func) {
        List<FileEntity> children = root.getChildren();

        for (int i = 0; i < children.size(); i++) {
            FileEntity file = children.get(i);

            func.accept(root, file);

            if ("dir".equals(file.getFileType())) {
                dfsFileEntity(file, func);
            }
        }
    }

    // 递归复制树
    public static TreeItem copy(FileEntity root) {

        // 注册 GlyphFont（默认已经注册了 FontAwesome）
        GlyphFont fontAwesome = GlyphFontRegistry.font("FontAwesome");

        // 创建根节点，并设置 FontAwesome 文件夹图标
        Glyph folderIcon = fontAwesome.create("\uf07b").size(14); // FontAwesome 的文件夹图标
        Glyph fileIcon = fontAwesome.create("\uf15b").size(14); // FontAwesome 的文件夹图标

        TreeItem copyNode = new TreeItem(root
                , "dir".equals(root.getFileType())
                ? folderIcon
                : fileIcon
        );
        if (root.getChildren() != null) {
            for (FileEntity child : root.getChildren()) {
                copyNode.getChildren().add(copy(child));
            }
        }
        return copyNode;
    }


    /**
     * 删除文件夹
     * @param folder
     */
    public static void deleteFolder(File folder) {
        if (folder.isDirectory()) {
            File[] files = folder.listFiles();
            if (files != null) { // 确保文件夹非空
                for (File file : files) {
                    deleteFolder(file); // 递归删除子文件和子目录
                }
            }
        }
        folder.delete(); // 删除空文件夹或文件
    }

}